package com.wenx.v3system.modular.platform.service;

import com.wenx.base.rest.BaseRestService;
import com.wenx.v3system.modular.platform.domain.dto.PlatformTenantDto;
import com.wenx.v3system.modular.platform.domain.query.PlatformTenantQuery;

import java.util.List;
import java.util.Map;

/**
 * 平台租户服务接口
 * 
 * @author wenx
 */
public interface PlatformTenantService extends BaseRestService<PlatformTenantDto, PlatformTenantQuery> {

    /**
     * 根据租户ID查询租户
     *
     * @param id 租户ID
     * @return 租户信息
     */
    PlatformTenantDto getTenantById(Long id);

    /**
     * 根据租户编码查询租户
     *
     * @param code 租户编码
     * @return 租户信息
     */
    PlatformTenantDto getTenantByCode(String code);

    /**
     * 根据域名查询租户
     *
     * @param domain 域名
     * @return 租户信息
     */
    PlatformTenantDto getTenantByDomain(String domain);

    /**
     * 创建租户（包含初始化数据库Schema）
     *
     * @param tenantDto 租户信息
     * @return 创建的租户
     */
    PlatformTenantDto createTenant(PlatformTenantDto tenantDto);



    /**
     * 删除租户（包含清理数据库Schema）
     *
     * @param tenantId 租户ID
     */
    void deleteTenant(Long tenantId);

    /**
     * 启用/禁用租户
     *
     * @param tenantId 租户ID
     * @param status   状态
     */
    void updateTenantStatus(Long tenantId, Integer status);

    /**
     * 查询即将过期的租户
     *
     * @param days 提前天数
     * @return 租户列表
     */
    List<PlatformTenantDto> getExpiringTenants(Integer days);

    /**
     * 查询活跃租户
     *
     * @param days 天数
     * @return 租户列表
     */
    List<PlatformTenantDto> getActiveTenants(Integer days);

    /**
     * 检查租户编码是否存在
     *
     * @param code     租户编码
     * @param tenantId 租户ID（编辑时排除自己）
     * @return 是否存在
     */
    boolean checkCodeExists(String code, Long tenantId);

    /**
     * 检查域名是否存在
     *
     * @param domain   域名
     * @param tenantId 租户ID（编辑时排除自己）
     * @return 是否存在
     */
    boolean checkDomainExists(String domain, Long tenantId);

    /**
     * 获取租户使用情况
     *
     * @param tenantId 租户ID
     * @return 使用情况统计
     */
    Map<String, Object> getTenantUsage(Long tenantId);

    /**
     * 延长租户有效期
     *
     * @param tenantId 租户ID
     * @param months   延长月数
     */
    void extendTenantExpiry(Long tenantId, Integer months);

    /**
     * 升级租户套餐
     *
     * @param tenantId 租户ID
     * @param planType 套餐类型
     * @param maxUsers 最大用户数
     */
    void upgradeTenantPlan(Long tenantId, String planType, Integer maxUsers);

}